package com.lgcns.weather.info;

import java.util.Arrays;
import java.util.Calendar;

import com.lgcns.weather.util.Util;

/**
 * 주간 예보 정보를 가지고 있는 클래스
 */
public class WeeklyInfo {
    /** 파싱 성공여부 */
    private boolean ok;
    /** 예보 시간 */
    private String forcastTime;
    /** 예보 시간(년) */
    private String year;
    /** 예보 시간(월) */
    private String month;
    /** 예보 시간(일) */
    private String day;
    /** 예보 시간(시) */
    private String hour;
    private String explain;
    private String[] temperatureMin;
    private String[] temperatureMax;
    private String[] weatherDescription;
    private String[] weatherCode;
    private String[] date;
    private String[] dayOfWeek;
    public static final int LENGTH = 6;
    private String[] dayOfWeekKor = { "일", "월", "화", "수", "목", "금", "토" };

    public WeeklyInfo() {
        this.ok = true;
        this.temperatureMin = new String[LENGTH];
        this.temperatureMax = new String[LENGTH];
        this.weatherDescription = new String[LENGTH];
        this.weatherCode = new String[LENGTH];
    }

    /**
     * 화면 출력용 예보 일자를 반환한다.
     * 
     * @return
     */
    public String getForcastTimeString() {
        return Util.formatTimeString(forcastTime);
    }

    public void setForcastTime(String forcastTime) {
        this.forcastTime = forcastTime;
        if (forcastTime != null && forcastTime.length() >= 10) {
            year = forcastTime.substring(0, 4);
            month = forcastTime.substring(4, 6);
            day = forcastTime.substring(6, 8);
            hour = forcastTime.substring(8, 10);
        }
    }

    /**
     * 최저기온을 보관한다.
     * 
     * @param index
     * @param value
     */
    public void setTemperatureMin(int index, String value) {
        temperatureMin[index] = value;
    }

    /**
     * 최저기온을 반환한다.
     * 
     * @param index
     * @return
     */
    public String getTemperatureMin(int index) {
        return temperatureMin[index];
    }

    /**
     * 최고기온을 보관한다.
     * 
     * @param index
     * @param value
     */
    public void setTemperatureMax(int index, String value) {
        temperatureMax[index] = value;
    }

    /**
     * 최고기온을 반환한다.
     * 
     * @param index
     * @return
     */
    public String getTemperatureMax(int index) {
        return temperatureMax[index];
    }

    /**
     * 날씨설명을 보관한다.
     * 
     * @param index
     * @param value
     */
    public void setWeatherDescription(int index, String value) {
        weatherDescription[index] = value;
    }

    /**
     * 날씨설명을 반환한다.
     * 
     * @param index
     * @return
     */
    public String getWeatherDescription(int index) {
        return weatherDescription[index];
    }

    /**
     * 날씨코드를 보관한다.
     * 
     * @param index
     * @param value
     */
    public void setWeatherCode(int index, String value) {
        weatherCode[index] = value;
    }

    /**
     * 날씨코드를 반환한다.(01, 02, 03, ...)
     * 
     * @param index
     * @return
     */
    public String getWeatherCode(int index) {
        String shortWeatherCode = null;
        if (weatherCode[index] != null && weatherCode[index].length() >= 4) {
            shortWeatherCode = weatherCode[index].substring(2, 4);
        }
        return shortWeatherCode;
    }

    /**
     * 날짜를 반환한다.
     * 
     * @param index
     * @return
     */
    public String getDate(int index) {
        generateDateInfo();
        return date[index];
    }

    /**
     * 요일을 반환한다.
     * 
     * @param index
     * @return
     */
    public String getDayOfWeek(int index) {
        generateDateInfo();
        return dayOfWeek[index];
    }

    /**
     * 날짜, 요일 정보를 생성한다.
     */
    private void generateDateInfo() {
        // 아직 생성되지 않은 경우
        if (date == null || date.length == 0) {
            date = new String[LENGTH];
            dayOfWeek = new String[LENGTH];

            // 주간예보는 발표일 2일 후 부터 6일간 제공
            String forcastDateString = year + month + day;
            Calendar forcastDate = Util.parseCalendar(forcastDateString);
            Calendar nextDate = Util.addDate(forcastDate, 1);

            for (int i = 0; i < LENGTH; i++) {
                nextDate = Util.addDate(nextDate, 1);
                date[i] = Util.getSimpleDate(nextDate);
                dayOfWeek[i] = dayOfWeekKor[nextDate.get(Calendar.DAY_OF_WEEK) - 1];
            }
        }
    }

    /* ------------ 자동 생성된 getter / setter ------------------ */

    public boolean isOk() {
        return ok;
    }

    public void setOk(boolean ok) {
        this.ok = ok;
    }

    public String getForcastTime() {
        return forcastTime;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getMonth() {
        return month;
    }

    public void setMonth(String month) {
        this.month = month;
    }

    public String getDay() {
        return day;
    }

    public void setDay(String day) {
        this.day = day;
    }

    public String getHour() {
        return hour;
    }

    public void setHour(String hour) {
        this.hour = hour;
    }

    public String getExplain() {
        return explain;
    }

    public void setExplain(String explain) {
        this.explain = explain;
    }

    @Override
    public String toString() {
        return "WeekWeatherInfo [day=" + day + ", explain=" + explain + ", forcastTime=" + forcastTime
                + ", hour=" + hour + ", month=" + month + ", ok=" + ok + ", temperatureMax="
                + Arrays.toString(temperatureMax) + ", temperatureMin=" + Arrays.toString(temperatureMin)
                + ", weatherCode=" + Arrays.toString(weatherCode) + ", weatherDescription="
                + Arrays.toString(weatherDescription) + ", year=" + year + "]";
    }
}
